package com.trust.pams.util;

import com.alibaba.dubbo.common.utils.StringUtils;
import com.trust.pams.model.Io.SvnGetFileTypeEnum;
import com.trust.pams.model.Tree.Tree;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.io.SVNRepository;

import java.util.*;

public class SvnOption {

    private static String pid;

    private static List<Tree> treeResult = new ArrayList<>();

    /**
     * @Author: winterchen
     * @Description: 获取版本库中某一目录下的所有条目。可以根据参数选择是否进行递归
     * @param repository
     * @param path  需要查找的svn路径（相对路径）前面不需要/
     * @param typeEnum  文件类型
     * @param fileNameSearch    文件名过滤条件
     * @param isGetNext 是否递归 true  递归
     */
    public static List<Tree> getSvnFileBaseInfoDto(SVNRepository repository, String path,
                                             String fileNameSearch, SvnGetFileTypeEnum typeEnum,
                                             boolean isGetNext,String projectGuid)throws SVNException {
        List<Tree> root = new ArrayList<>();
        listEntries(repository,path,root,fileNameSearch,typeEnum,isGetNext,projectGuid);
        return root;
    }

    /**
     * @Author: winterchen
     * @Description: 获取版本库中某一目录下的所有条目。可以根据参数选择是否进行递归
     * @param repository
     * @param path  需要查找的svn路径（相对路径）前面不需要/
     * @param result    最后封装的容器
     * @param typeEnum  文件类型
     * @param fileNameSearch    文件名过滤条件
     * @param isGetNext 是否递归 true  递归
     */
    public static void listEntries(SVNRepository repository, String path, List<Tree> result,
                                   String fileNameSearch, SvnGetFileTypeEnum typeEnum,
                                   boolean isGetNext,String projectGuid) throws SVNException {
        //获取版本库的path目录下的所有条目。参数－1表示是最新版本。
        try {
        Collection entries = repository.getDir(path, -1, null, (Collection) null);
        Iterator iterator = entries.iterator();
        boolean flag = true;
        SVNDirEntry entry;
        int i = 0;
        while (iterator.hasNext()) {
            i++;
            Tree tree = new Tree();
            flag = true;
            entry = (SVNDirEntry) iterator.next();
            //进行参数的匹配
            if (typeEnum != null && SvnGetFileTypeEnum.all != typeEnum) {
                    flag = entry.getKind().toString().equalsIgnoreCase(typeEnum.getValue());
            }
            if (StringUtils.isNotEmpty(fileNameSearch) && !entry.getName().equals(fileNameSearch)) {
                 flag = false;
            }
            if (flag) { //如果两个条件都不为空，并且都通过了
                tree.setId(UUIDUtil.generateUUID());
                tree.setFileName(entry.getName());
                tree.setPath(entry.getURL().getPath());
                tree.setProjectGuid(projectGuid);
                result.add(tree);
            }
            //判断是否需要进行递归
            if (flag && isGetNext) {
                /*
                 * 检查此条目是否为目录，如果为目录递归执行
                 */
//                System.out.println(entry.getName());
                if (entry.getKind() == SVNNodeKind.DIR) {
                    List<Tree> children = new ArrayList<>();
                    //递归并封装成树形结构
                    tree.setChildren(children);
                    listEntries(repository, (path.equals("")) ? entry.getName()
                            : path + "/" + entry.getName(), children, null, typeEnum, true,projectGuid);
                }
            }
        }
        }catch (SVNException e){
            System.err.println("打印版本树时发生错误: " + e.getMessage());
        }
    }
}
